package cn.yunyichina.scheduler.jobs.common.service;

import cn.yunyichina.scheduler.jobs.common.exception.SystemException;
import cn.yunyichina.scheduler.jobs.common.jackson.Jackson;
import cn.yunyichina.scheduler.jobs.constant.BizConstant;
import cn.yunyichina.scheduler.jobs.constant.CacheConstant;
import cn.yunyichina.scheduler.jobs.constant.EasyHealthConstant;
import cn.yunyichina.scheduler.jobs.entity.message.MsgTemplate;
import cn.yunyichina.scheduler.jobs.entity.message.MsgTemplateContent;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;

/**
 * Created by Lullaby on 2016/8/18.
 */
@Service
public class MessagePushService {

    private static final Logger logger = LoggerFactory.getLogger(MessagePushService.class);

    @Resource
    private JedisPool jedisPool;

    @Resource
    private MsgTempManager msgTempManager;

    public void pushMessage(String appId, String templateCode, String platformType, String openId, Map<String, Serializable> paramMap) {
        /**
         * add by dengsw at 20160516 先根据alipayId去缓存里面取appId，如果取得到那么，就是用缓存的appId如果取不到，那么就使用传进来的appId
         */
        try (Jedis jedis = jedisPool.getResource()) {
            logger.debug("传入进来的appId是：" + appId);
            String filed001 = EasyHealthConstant.ALIPAYID_APPID_FIELD_PRE + openId;
            String appIdCache = jedis.hget(EasyHealthConstant.ALIPAYID_APPID_KEY, filed001);
            logger.debug("重新设置appId与alipayId的对应关系，field={}，value={}", filed001, appIdCache);
            if (StringUtils.isNotBlank(appIdCache) && !CacheConstant.CACHE_KEY_NOT_EXIST.equalsIgnoreCase(appIdCache)) {
                appId = appIdCache;
            }
        }
        MsgTemplate msgTemplate = null;
        if (BizConstant.MODE_TYPE_WEIXIN.equals(platformType)) {
            msgTemplate = msgTempManager.getMsgTemplate(appId, templateCode, "1");
        } else if (BizConstant.MODE_TYPE_ALIPAY.equals(platformType)) {
            msgTemplate = msgTempManager.getMsgTemplate(appId, templateCode, "2");
        } else if (BizConstant.MODE_TYPE_EASYHEALTH.equals(platformType)) {
            msgTemplate = msgTempManager.getMsgTemplate(appId, templateCode, "3");
        }

        logger.info("wuwl msgTemplate1111:" + (msgTemplate == null ? "null" : msgTemplate.toString()));

        if (msgTemplate != null) {
            templatePush(appId, templateCode, platformType, openId, paramMap, msgTemplate);
        } else {
//            MsgCustomer msgCustomer = msgManager.getMsgCustomer(appId, templateCode, BizConstant.MODE_TYPE_WEIXIN.equals(platformType) ? "1" : "2");
//            logger.info("wuwl msgTemplate2222:" + (msgCustomer == null ? "null" : msgCustomer.toString()));
//            if (msgCustomer != null) {
//                customerPush(appId, templateCode, platformType, openId, paramMap, msgCustomer);
//            } else {
//                logger.error("找不到该消息!appId:" + appId + ",templateCode:" + templateCode + ",platformType:" + platformType);
//                throw new SystemException("找不到该消息!appId:" + appId + ",templateCode:" + templateCode + ",platformType:" + platformType);
//            }
        }
    }

    public void templatePush(String appId, String templateCode, String platformType, String openId, Map<String, Serializable> paramMap,
                             MsgTemplate msgTemplate) {
//        for (String key : paramMap.keySet()) {
//            msgTemplate.setUrl(msgTemplate.getUrl().replaceAll("%" + key + "%", Matcher.quoteReplacement(String.valueOf(paramMap.get(key)))));
//        }
//        logger.info("templatePush:===:" + msgTemplate.getUrl());
//        List<MsgTemplateContent> msgTemplateContents = new ArrayList<MsgTemplateContent>();
//
//		/* edit by dengsw at 20160602 换成以下处理逻辑
//        for (MsgTemplateContent msgTemplateContent : msgTemplate.getMsgTemplateContents()) {
//			for (String key : paramMap.keySet()) {
//				msgTemplateContent.setValue(msgTemplateContent.getValue().replaceAll("%" + key + "%",
//						Matcher.quoteReplacement(String.valueOf(paramMap.get(key)))));
//			}
//			msgTemplateContents.add(msgTemplateContent);
//		}*/
//
//        /**
//         * edit by dengsw at 20160602 修改逻辑 在msgTemplateContent.getValue()中主动收索%key%取出来后再到paramMap.get(key)，如果为空那么替换成空字符串
//         */
//        for (MsgTemplateContent msgTemplateContent : msgTemplate.getMsgTemplateContents()) {
//            String content = msgTemplateContent.getValue();
//            int start = -1;
//            int end = -1;
//            List<String> keys = new ArrayList<String>();
//            while (true) {//截取content的所有key放在keys数组中
//                start = content.indexOf("%", start);
//                end = content.indexOf("%", start + 1);
//                if (start == -1 || end == -1) {//没有找到%开头或结束那么说明，不含key
//                    break;
//                }
//                keys.add(content.substring(start + 1, end));
//                start = end + 1;
//            }
//            if (logger.isDebugEnabled()) {
//                logger.debug("模板的原始内容是：{}，截取出来的key是：{}", content, Jackson.getBaseJsonData(keys));
//            }
//            for (String key : keys) {//循环数组并且去参数中取出替换null替换成""
//                Serializable value = paramMap.get(key);
//                value = (value == null ? "" : value);
//                content = content.replace("%" + key + "%", Matcher.quoteReplacement(String.valueOf(value)));
//            }
//            if (logger.isDebugEnabled()) {
//                logger.debug("模板替换后的内容是：{}。", content);
//            }
//            msgTemplateContent.setValue(content);
//            msgTemplateContents.add(msgTemplateContent);
//        }
//
//        msgTemplate.setMsgTemplateContents(msgTemplateContents);
//        String jsonStr = Jackson.getBaseJsonData(msgTemplate);
//
//        //HospitalCodeAndAppVo hospitalCodeAndAppVo = baseDatasManager.queryHospitalCodeByApp(platformType, appId);
//
//        String msgAppId = null;
//        if (BizConstant.MODE_TYPE_ALIPAY.equalsIgnoreCase(platformType)) {
//            msgAppId = SDKPublicArgs.EASYHEALTH_ALIPAY_APPID;
//        }
//        if (BizConstant.MODE_TYPE_WEIXIN.equalsIgnoreCase(platformType)) {
//            msgAppId = SDKPublicArgs.EASYHEALTH_WECHAT_APPID;
//        }
//
//        String msgPrivateKey = null;
//        if (BizConstant.MODE_TYPE_ALIPAY.equalsIgnoreCase(platformType)) {
//            msgPrivateKey = SDKPublicArgs.EASYHEALTH_ALIPAY_PRIVATEKEY;
//        }
//        if (BizConstant.MODE_TYPE_WEIXIN.equalsIgnoreCase(platformType)) {
//            msgPrivateKey = SDKPublicArgs.EASYHEALTH_WECHAT_PRIVATEKEY;
//        }
//
//        if (logger.isDebugEnabled()) {
//            logger.debug("platformType:{},msgAppId:{}", new Object[]{platformType, msgAppId});
//        }
//
//        // 如果失败,则继续推送,三次都失败,放弃
//        JSONObject jsonObject = null;
//        int pushStatus = 1;
//        int pushFailedNum = 0;
//        for (int i = 0; i < 3; i++) {
//            //jsonObject = YXW.pushTemplateMsg(platformType, openId, appId, hospitalCodeAndAppVo.getPrivateKey(), msgTemplate);
//            jsonObject = YXW.pushTemplateMsg(platformType, openId, msgAppId, msgPrivateKey, msgTemplate);
//            if (logger.isDebugEnabled()) {
//                logger.debug("pushMsg[{}] times {}. result: {}", new Object[]{templateCode, i, jsonObject});
//            }
//            pushFailedNum = i + 1;
//            // jsonObject不为空则表示http请求成功,不再继续推送,不管推送是否成功
//            if (jsonObject != null) {
//                if (0 == jsonObject.getInteger("errcode")) {
//                    // 成功
//                    pushStatus = 1;
//                    break;
//                } else {
//                    // 失败
//                    pushStatus = 2;
//                }
//
//            } else {
//                // http请求失败
//                pushStatus = 3;
//            }
//        }
//        MsgLog msgLog =
//                new MsgLog(msgTemplate.getMode(), jsonObject.getString("errcode"), jsonObject.getString("errmsg"), appId,
//                        msgTemplate.getHospitalId(), openId, BizConstant.MODE_TYPE_WEIXIN.equals(platformType) ? 1 : 2, pushStatus, pushFailedNum,
//                        jsonStr, new Date());
//        msgLogDao.add(msgLog);
    }

}
